/**
 * 懒汉式单例,双重检查，线程安全
 *
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/10 20:09
 **/
public class LazySingleton {
    /**
     * 注意，这里一定要使用volatile关键字来修饰，保证singleton对其他线程的可见性
     * 以及防止指令重排（保证有序性）
     * 如果不添加该关键字，可能会在多线程环境下某个线程获取到还未被初始化的对象
     */
    private volatile static LazySingleton singleton;

    private LazySingleton() {

    }

    /**
     * 获得实例,双重检查
     *
     * @return {@code LazySingleton}
     */
    public static LazySingleton getInstance() {
        if (singleton == null) {
            //如果为null则竞争锁
            synchronized (LazySingleton.class) {
                //此时需要进行双重检查，防止其他线程在竞争到锁之后时间片用完,
                //再次被唤醒获取锁之后重复创建对象
                if (singleton == null) {
                    singleton = new LazySingleton();
                }
            }
        }
        return singleton;
    }
}
